package com.keywaysoft.workflow.service;

import com.keywaysoft.workflow.dto.*;
import com.keywaysoft.workflow.utils.Page;
import com.keywaysoft.workflow.utils.R;
import com.keywaysoft.workflow.vo.ActRuTask;
import com.keywaysoft.workflow.vo.CommentVO;

import java.util.List;
import java.util.Map;

/**
 * @author zhaojx
 */
public interface IProcessEngine {


    /**
     * 启动流程
     *
     * @return
     */
    R start(StartTaskDTO dto);

    /**
     * 根据流程key查询流程实例
     *
     * @param processDefinitionKey
     * @return
     */
    R searchProcessInstance(String processDefinitionKey);

    /**
     * 挂起、激活流程实例 （挂起、激活单个流程实例）
     *
     * @param processInstanceId
     * @return
     */
    R updateState(String processInstanceId);

    /**
     * 根据流程ID查询流程实例
     *
     * @param processId
     * @return
     */
    R searchByID(String processId);

    /**
     * 根据流程实例ID删除流程实例
     *
     * @param processId
     * @return
     */
    R deleteProcessInstanceByID(String processId);

    /**
     * 根据流程实例key删除流程实例
     *
     * @param processDefinitionKey
     * @return
     */
    R deleteProcessInstanceByKey(String processDefinitionKey);


    /**
     * 撤回审批
     *
     */
    void withdrawApproval(TaskBaseDTO dto);

    /**
     * 获取当前用户任务流转数据
     *
     * @param taskId 当前任务ID
     * @return map
     */
    R<Map<String, Object>> getCurrentUserTaskVariables(String taskId);

    /**
     * 获取流程实例流转意见
     *
     * @param processInstanceId 流程实例ID
     * @return ProcessQuery
     */
    R<List<CommentVO>> getProcessInstanceComments(String processInstanceId);

    /**
     * 回退首环节
     *
     */
    void backToFirstNode(BackTaskDTO dto);

    R getNodeList(String taskId);

    /**
     * 回退上一环节
     *
     */
    void backToPreNode(BackTaskDTO dto);

    /**
     * 回退某环节
     *
     */
    void back2Node(TargetBackTaskDTO dto);

    /**
     * 结束流程
     *
     */
    void endTask(BackTaskDTO dto);

    /**
     * 查询所有任务
     *
     * @return
     */
    R<Page<ActRuTask>> taskQuery(FindTaskByAssigneeDTO dto);

    /**
     * 查询当前用户的待办任务
     *
     * @param dto
     * @return
     */
    R<Page<ActRuTask>> findTaskByAssignee(FindTaskByAssigneeDTO dto);

    /**
     * 完成任务
     *
     * @param dto
     * @return
     */
    R completeTask(CompleteTaskDTO dto);

    /**
     * 任务转办
    
     * @return
     */
    R turnTask(TaskBaseDTO dto);

    /**
     * 签收任务
     * @return
     */
    R claim(TaskBaseDTO dto);

    /**
     * 取回签收任务
     * @return
     */
    R unclaim(TaskBaseDTO dto);

    /**
     * 委派任务
    
     * @return
     */
    R delegateTask(TaskBaseDTO dto);

    /**
     * 完成委派任务
     * @param dto
     * @return
     */
    R resolveTask(TaskDTO dto);
}
